--- title: "07-vue 入门" created: 2025-11-25 tags: - 项目筑基 --- # vue 入门 > 从三件套到框架:组件思想、声明式编码、虚拟 dom,用尚硅谷的开头两节把插值语法和指令语法跑通,vue 实例与容器是"一夫一妻制"。 ## 为什么是 vue 以组件的形式进行编写前端代码 ![[vue-image1.png]] 页面中的每一个模块都是一个 .vue 文件 所谓复用率 就是当一个新页面也需要某个块的时候 只需要引入对应的 .vue 文件即可 而更好维护也是同理 只需要修改 .vue 里的东西 就可以全部进行更改 (很符合封装的思想 把一个一个功能封装起来 要用的时候调用即可 更改也方便) 对于数据 它采用声明式编码 比如这个 要把数据变成 ul 里面的 li ![[vue-image2.png]] 用 js 势必要写成: 一行代码都不能少 命令式地往下执行 ![[vue-image3.png]] 而 vue 采用声明式 用 v-for 去遍历(其实就是内部写好了 调用接口) ![[vue-image4.png]] ### 虚拟 dom + diff 算法 对于一些更新的数据 原始做法是不管三七二十一 直接重新执行一遍 dom 去做覆盖 ![[vue-image5.png]] 这样的话 如果只是添加了某条记录 就要做很多无用功 vue 采用中间加上一层虚拟 dom 使用 diff 算法 在这层虚拟 dom 里进行比对 再去变成真实的页面 dom ![[vue-image6.png]] 说白了其实就是把它把很多东西都做了一个封装 以类似函数调用的形式进行编程 然后同时也提供了很多库函数 (对于一些常用的功能它写好了 而且写的比你好 你要会调用接口) 其实本质也就是封装函数 准备工作:下载 vue、vue 开发者工具插件、vscode 中的 liveserver 插件 ## hello,?(插值语法) 首先以一个最简单的例子来对这样的模版化的东西做个了解 hello,world 这个 world 可以换成其他东西 由后端传入 就可以写成 ```html

hello, {{ name }}

``` 在 {{}} 中的东西就是被传入的可变化的东西 当然 这需要先 new 一个 Vue 对象 ```html ``` 当然再前提是要引入 vue.js 文件 ```html ``` el 指的就是找到 id:root 的标签 data 是以类的形式去写的 这样可以提高拓展性 ![[vue-image7.png]] ![[vue-image8.png]] 完整的一个 hello 案例: ```html 第一次使用vue

hello, {{ name }}

{{name.toUpperCase()}},{{address}} {{1+1}} {{Date.now()}}

``` 知识点小结: 1. 想让 Vue 工作,就必须创建一个 Vue 实例,且要传入一个配置对象; 2. root 容器里的代码依然符合 html 规范,只不过混入了一些特殊的 Vue 语法; 3. root 容器里的代码被称为【Vue 模板】; 4. Vue 实例和容器是一一对应的; 5. 真实开发中只有一个 Vue 实例,并且会配合着组件一起使用; 6. {{xxx}} 中的 xxx 要写 js 表达式,且 xxx 可以自动读取到 data 中的所有属性; 7. 一旦 data 中的数据发生改变,那么页面中用到该数据的地方也会自动更新。 ### 工作流程 先有的容器(带着标签的 div 等)再有的 Vue 实例 当 Vue 实例开始工作的时候 发现 el 中的配置(指定的选择器) 找到那个容器 于是把整个容器拿过来解析 检查有没有自己设计的一些语法(data 中的关键字) 在容器中找到了"{{name}}"回到 data 里找到 name 然后把 data 中 name 的值全部替换掉容器里的 {{name}} **模板 -> 解析 -> 全新 div** ### 一夫一妻制 然后注意的一点是容器与实例是一对一的 想一个标签用多个 vue 去管理或者多个标签用同一个 vue 管理都是不行的 **一夫一妻制** 如果以后东西多了 这个 hello,world 里有 100 个数据是动态的 就意味着 data 里面也要写 100 行东西 这就显得很庞大 因为这种一夫一妻的制度 确实只能这样 一个容器用一个实例对应 但是 实例是可以拆解的 可以把它拆成多个部分 40 条给第一部分管理 20 条给第二部分…… 这样的各个部分其实就是"组件"的思想 ## 跳转 url(指令语法) 对于标签里面的内容可以这样随意替换成其他内容 (用插值语法) 那如果是一个 a 标签中的 url 呢 想让它也不是写死的 能变化该怎么办 也是一样写法吗 ```html
这是一个超链接
``` ```js new Vue({ el: "#root", data: { url: 'https://www.baidu.com', } }) ``` 貌似不太行 ![[vue-image9.png]] 其实可以发现这完全不一样 之前的插值语法针对的对象是 div 等标签里面的元素 而这里的 url 是标签的一个属性 都不是同一个东西 所以这里要用另一种方法——**指令语法** 在 href 前使用 v-bind 属性 表示后面的 url 里面的东西都被当成 js 语句执行 ```html
这是一个超链接
``` 可以惊奇的发现 url 被替换成了 data 中 url 里面的东西 ![[vue-image10.png]] 然后这个 v-bind: 是可以缩写的 缩写成 : 那么可以写成:`这是一个超链接` 也就是在正常写法中 在 href 前加个 : 然后原本填入的真实 url 用一个字符串代替 改写到 vue 实例中 由后端传入 ### 模板语法两大类 Vue 模板语法有 2 大类: **1. 插值语法:** - 功能:用于解析标签体内容。 - 写法:{{xxx}},xxx 是 js 表达式,且可以直接读取到 data 中的所有属性。 **2. 指令语法:** - 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件.....)。 - 举例:v-bind:href="xxx" 或 简写为 :href="xxx",xxx 同样要写 js 表达式,且可以直接读取到 data 中的所有属性。 - 备注:Vue 中有很多的指令,且形式都是:v-????,此处我们只是拿 v-bind 举个例子。 完整示例: ```html 模板语法

插值语法

你好,{{name}}


指令语法

点我去{{school.name}}学习1 点我去{{school.name}}学习2
``` ## 附件 - [[vue.docx|vue.docx]] --- ⬅️ [[06-入门小项目|06-入门小项目]] 🏠 [[00-前端与可视化|00-前端与可视化]] ➡️ [[08-关于svg|08-关于svg]]